/**
 * 表格按钮插件
 * created by zhangqi
 * @btns 按钮组
 * @morebtns 更多按钮组
 * @oMetadata  表格对象
 * */
define(function(require, exports, module) {
    var tools = require("commonStaticDirectory/plugins/tools"); //工具函数集
    require("commonStaticDirectory/plugins/underscore.min.js");

    !function($){
        var MMButton = function(element, options){
            this.$el = $(element);
            this.opts = options;
            //获取infoSetId
            if(this.opts.oMetadata){
                this.infoSetId = this.opts.oMetadata.options.infoSetId || "";
            }else{
                var params = location.hash;
                var oPara = {}; //附加其他参数
                if(params && params.indexOf(':') > -1) {
                    params.replace(/(\w+)\s*:\s*([\w-]+)/g, function(a, b, c) {
                        b && (oPara[b] = c);
                    });
                } else {
                    oPara = params;
                }
                this.infoSetId = oPara.infoSetId || "";
            }
            this.restoreBtnHtml = '<span class="iconfont_dayhr_base base_restore_btn" title="还原按钮">&#xe60d;</span>';

            this.initMmButtons();
        };

        MMButton.prototype = {
            constructor: MMButton
            /**
             * 初始化按钮dom
             * */
            ,initMmButtons: function(){
                var t = this;
                var $el = this.$el;
                $el.addClass("mmButton");
                t.oBtnFuncData = {}; //缓存按钮的点击事件function

                var btnHtml = "";
                $el.html(btnHtml);
                if (this.opts.btns.length > 0) {
                    for ( var i = 0; i < this.opts.btns.length; i++) {
                        var btn = this.opts.btns[i];
                        if (i == 0) {
                            btnHtml =  "<a href='javascript:void(0);' class='"+btn.className+"' id='btn_" + i + "'>"
                                +"<i class='iconfont' style='"+(btn.icon?'':'display:none;')+"'>"+(btn.icon?btn.icon:'')+"</i>"
                                + btn.btnName + "</a>";
                        } else {
                            btnHtml = "<a href='javascript:void(0);' class='"+btn.className+"'  id='btn_" + i + "'>"
                                +"<i class='iconfont' style='"+(btn.icon?'':'display:none;')+"'>"+(btn.icon?btn.icon:'')+"</i>"
                                + btn.btnName + "</a>";
                        }

                        $el.html(btnHtml);
                        $el.off("click","#btn_"+i).on("click","#btn_"+i, btn.btnfn);
                    }
                }

                //用来放快捷常用按钮的容器
                btnHtml += '<div style="display: inline;" id="base_shortcut_btn_wrap">';
                var oBtn = tools.Cache.getCache("oShortcutBtn","local") || {}; //按钮对象
                var aBtn = oBtn[t.infoSetId];
                var aBtnOldId = [];
                if($.isArray(aBtn) && aBtn.length){
                    for(var i=0;i<aBtn.length;i++){
                        btnHtml += '<a href="javascript:void(0);" class="flabutton fla-white base_shortcut_btn" data-oldid="'+aBtn[i]["data-oldid"]+'" data-name="'+aBtn[i]["data-name"]+'">'+aBtn[i]["data-name"]+' '+t.restoreBtnHtml+'</a>';
                        aBtnOldId.push(aBtn[i]["data-oldid"]);
                    }
                }
                btnHtml += '</div>';

                if (this.opts.morebtns && this.opts.morebtns.length) {
                    btnHtml += "<div class='more_menu'><a class='flabutton dropdown' href='javascript:void(0);'>更多&nbsp;<i class='iconfont_dayhr_base'>&#xe600;</i></a><ul class='more_menu_topUl'></ul></div>";
                    $el.html(btnHtml);

                    /**
                     * 拼接按钮组
                     * @aBtns 按钮对象数组
                     * @sStartId  开始拼接到id上的编号 ，目的是使每个按钮的id保持唯一
                     * */
                    var setBtnDom = function(aBtns, sStartId){
                        var aBtnHtml = [];//按钮组
                        for ( var i = 0; i < aBtns.length; i++) {
                            var btn = aBtns[i];
                            var sBtnId = "bmn_"+t.infoSetId+"_"+sStartId+"_"+i;
                            var sDataStr = ""; //菜单data附加数据
                            var sChildrenHtml = ""; //子菜单dom
                            var isShowSendBtn = true; //是否显示设置常用按钮

                            //如果按钮上有数据
                            if(btn.btnData){
                                for(var j in btn.btnData){
                                    sDataStr += ' data-'+j+'="'+btn.btnData[j]+'" ';
                                }
                            }
                            if(btn.children && btn.children.length){
                                sChildrenHtml = '<ul class="more_menu_childUl">'+setBtnDom(btn.children,sStartId+"_"+i)+'</ul>';
                            }
                            //如果有下级菜单
                            if(!sChildrenHtml){
                                t.oBtnFuncData[sBtnId] = btn.btnfn;
                            }
                            
                            //如果是无组织员工按钮,薪酬处理正常发放按钮，社保处理-代缴人员按钮，或者有子菜单就不显示设置按钮
                            if(!$.isEmptyObject(btn.btnData)){
                                if(btn.btnData.btnId == "noOrgPerson" || btn.btnData.btnId == "ext_btn_paymentList" || btn.btnData.btnId == "ext_btn_paylist" || sChildrenHtml){
                                    isShowSendBtn = false;
                                }
                            }


                            var sLi = "" +
                                "<li "+sDataStr+" style='"+((btn.isShow && _.indexOf(aBtnOldId,sBtnId) == -1)?"display:block":"display:none")+"' data-ishide='"+((btn.isShow && _.indexOf(aBtnOldId,sBtnId) == -1)?"false":"true")+"'>" +
                                "   <a style='"+(btn.btnStyle?btn.btnStyle:"")+"' href='javascript:void(0);' id='"+sBtnId+"'>"+"<i  class='iconfont_dayhr_base' style='"+(btn.icon?'':'display:none;')+"'>"+(btn.icon?btn.icon:'')+"</i>"+ btn.btnName + "</a>  "+sChildrenHtml+" " +
                                "   <span class='base-has-childrenbutton iconfont_dayhr_base' style='"+(sChildrenHtml?'':'display:none;')+"'>&#xe602;</span>" +
                                "   <span class='base-send-button iconfont_dayhr_base' title='设为常用' style='"+(isShowSendBtn?'':'display:none;')+"'>&#xe60e;</span>" +
                                "</li>"; //每个按钮
                            aBtnHtml.push(sLi);
                        }
                        return aBtnHtml.join("");
                    };
                    $el.find(".more_menu").find("ul.more_menu_topUl").html(setBtnDom(this.opts.morebtns,"0"));
                    t.checkHowToShowMoreBtn(); //检测是否显示“更多”按钮
                    t.bindEvent(); //绑定一些事件
                }
            }
            /**
             * dom初始化完毕之后初始化绑定一些事件
             * */
            ,bindEvent:function () {
                var t = this;
                var $el = t.$el;
                //按钮的点击事件
                $el.find(".more_menu").find("ul.more_menu_topUl").on("click","a",function(){
                    if(typeof t.oBtnFuncData[$(this).attr("id")] == "function"){
                        t.oBtnFuncData[$(this).attr("id")](this);
                    }
                    $el.find("ul.more_menu_topUl").hide();
                    $el.find("a.dropdown").find("i.iconfont_dayhr_base").css({ transform: "rotate(0deg)" });
                });

                //绑定下拉显示更多事件
                $el.find(".more_menu").find("a.dropdown").bind("click",function(e){
                    if($el.find("ul.more_menu_topUl").is(":hidden")){
                        $el.find("ul.more_menu_topUl").show();
                        $el.find("a.dropdown").find("i.iconfont_dayhr_base").css({ transform: "rotate(180deg)" });
                        $(this).parent().addClass("on");
                    }else{
                        $el.find("ul.more_menu_topUl").hide();
                        $el.find("a.dropdown").find("i.iconfont_dayhr_base").css({ transform: "rotate(0deg)" });
                        $(this).parent().removeClass("on");
                    }
                    e.stopPropagation();
                });
                //点击页面其它位置时
                $(document).off("click.moreBtns").on('click.moreBtns',function(event){
                    if(!$(event.target).parents(".more_menu").length){
                        $(".more_menu").find("ul.more_menu_topUl").hide();
                        $el.find("a.dropdown").find("i.iconfont_dayhr_base").css({ transform: "rotate(0deg)" });
                        $el.find(".more_menu").removeClass("on");
                    }
                });

                //设置常用按钮
                $el.off("click.base-send-button").on("click.base-send-button",".base-send-button",function () {
                    var $parent = $(this).parent();
                    var sOldId = $parent.find(">a").attr("id");
                    var sText = $parent.find(">a").text();
                    var isHasThisBtn = false; //是否已经存在这个按钮

                    $("#base_shortcut_btn_wrap").find("a.base_shortcut_btn").each(function () {
                        if($(this).attr("data-oldid") == sOldId){
                            isHasThisBtn = true;
                            return false;
                        }
                    });
                    //只添加不存在的按钮
                    if(!isHasThisBtn){
                        var sBtn = '<a href="javascript:void(0);" class="flabutton fla-white base_shortcut_btn" data-oldid="'+sOldId+'" data-name="'+sText+'">'+sText+' '+t.restoreBtnHtml+'</a>';
                        $("#base_shortcut_btn_wrap").append(sBtn);
                        $parent.attr("data-ishide","true").hide();
                        t.addToCache(); //添加到缓存中
                    }else{
                        tools.showMsg.error("此按钮已经添加，不可重复添加");
                    }
                });

                //常用按钮的点击事件
                $el.off("click.base_shortcut_btn").on("click.base_shortcut_btn",".base_shortcut_btn",function () {
                    $el.find(".more_menu_topUl").find("a[id='"+$(this).attr("data-oldid")+"']").trigger("click");
                });

                //还原按钮点击事件
                $el.off("click.base_restore_btn").on("click.base_restore_btn",".base_restore_btn",function (e) {
                    var sId = $(this).parent().attr("data-oldid");
                    $(this).parent().remove();
                    $el.find(".more_menu_topUl").find("a[id='"+sId+"']").parent().attr("data-ishide","false").show();
                    t.addToCache(); //添加到缓存中
                    e.stopPropagation();
                });

                //窗口大小改变的时候，按钮显示不下去，要适当的隐藏一些
                var timer = null;
                $(window).on("resize.mmButton",function () {
                    clearTimeout(timer);
                    timer = setTimeout(function () {
                        t.calculateBtnNum();
                    },50);
                });
                setTimeout(function () {
                    t.calculateBtnNum();
                },100);
            }
            /**
             * 计算可以放置多少个按钮
             * */
            ,calculateBtnNum:function () {
                var t = this;
                if($("#base_shortcut_btn_wrap").length){
                    var $aBtns = $("#base_shortcut_btn_wrap").find(">a.base_shortcut_btn");
                    //按钮的预留空间的可用宽度 = 屏幕宽度 - 按钮容器距离左侧的距离 - 高级搜索容器的宽度 - 页面距离右侧的距离
                    var iLeftWidth = $(window).width() - $("#base_shortcut_btn_wrap").offset().left - $("#base_mmSearch").width() - 30;
                    //按钮需要占用的实际宽度
                    var iTotalWidth =  $aBtns.length * (98+10);
                    //如果预留的容器不够宽，计算能容纳多少按钮
                    if(iLeftWidth < iTotalWidth){
                        //多出的宽度，计算几个按钮需要被移除
                        var iRedundant = iTotalWidth - iLeftWidth;
                        var iBtnNum = Math.ceil(iRedundant/(98+10)); //向上取整
                        for(var i=1;i<=iBtnNum;i++){
                            var sId = $aBtns.eq($aBtns.length - i).attr("data-oldid");
                            $aBtns.eq($aBtns.length - i).remove();
                            t.$el.find("ul.more_menu_topUl").find("a[id='"+sId+"']").parent().show();
                        }
                        t.addToCache(); //添加到缓存中
                    }
                }
            }
            /**
             * 把按钮添加到缓存中
             * */
            ,addToCache:function () {
                var t = this;
                var oBtn = tools.Cache.getCache("oShortcutBtn","local") || {}; //按钮对象
                var sInfoSetId = t.infoSetId;
                oBtn[sInfoSetId] = []; //按钮数组
                t.$el.find("#base_shortcut_btn_wrap").find("a.base_shortcut_btn").each(function () {
                    oBtn[sInfoSetId].push({
                        "data-name":$(this).attr("data-name")
                        ,"data-oldid":$(this).attr("data-oldid")
                    });
                });
                tools.Cache.setCache("oShortcutBtn",oBtn,"local");
                t.checkHowToShowMoreBtn();
            }
            /**
             * 检测是否显示“更多”按钮
             * */
            ,checkHowToShowMoreBtn:function () {
                var t = this;
                //如果含有没有隐藏的菜单就显示"更多"按钮
                if($("#mmmmButton .more_menu_topUl").find("li[data-ishide='false']").length){
                    $("#mmmmButton .more_menu").show();
                }else{
                    $("#mmmmButton .more_menu").hide();
                }
            }


        };

        $.fn.extend({
            mmButton:function(options){
                options = $.extend({}, $.fn.mmButton.defaults, options);
                return (new MMButton(this[0], options));
            }
        });

        /*默认配置*/
        $.fn.mmButton.defaults = {
            btns : [],
            morebtns : [],
            hidebtn:[],
            hidename:null,
            cookieName:null
        };

        $.fn.mmButton.Constructor = MMButton;

    }(window.jQuery);


});
